home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <sys/types.h>
- #include <strings.h>
- #include <ctype.h>
- #include <stdlib.h>
-
- #include "mfrc.h"
-
- int cmpid(rl1,rl2)
- ref_list *rl1, *rl2;
- {
- return rl1->id - rl2->id;
- }
-
- int main(argc,argv)
- int argc;
- char **argv;
- {
- char *progname;
- FILE *fp, *of;
- info_header infobuf;
- type_info typbuf;
- ref_list *rfptr, *rfent;
- unsigned char *pdata, *cp, *cp2;
- char onm[BUFSIZ], anm[BUFSIZ];
- unsigned long rsrc,rsd,rsm;
- long rslen;
- unsigned short rstl;
- short rstypes;
- int c,len;
-
- progname = argv[0];
- if (argc < 2) {
- fprintf(stderr, "Usage: %s file ...\n", progname);
- exit(1);
- }
-
- while (--argc) {
- ++argv;
- fp = fopen(*argv,"r");
- if (fp == NULL) {
- perror(*argv);
- continue;
- }
-
- fprintf(stderr,"%s: ",*argv);
- if (fread(&infobuf,sizeof(info_header),1,fp) < 1 ) {
- fclose(fp);
- fprintf(stderr,"No header\n");
- continue;
- }
-
- if (infobuf.version || infobuf.nlen) {
- rsrc = sizeof(info_header) + (infobuf.dlen[0]<<24) +
- (infobuf.dlen[1]<<16) + (infobuf.dlen[2]<<8) +
- infobuf.dlen[3];
-
- if ((infobuf.type[0]!='L') || (infobuf.type[1]!='W')
- || (infobuf.type[2]!='F')
- || (infobuf.type[3]!='N')) {
- fclose(fp);
- fprintf(stderr,"File not type LWFN.\n");
- continue;
- }
-
- if (rsrc > sizeof(info_header))
- fseek(fp,rsrc,SEEK_SET);
- }
- else rsrc = 0;
-
- fread(&rsd,4,1,fp);
- fread(&rsm,4,1,fp);
- fseek(fp,rsrc+rsm+24,SEEK_SET);
- fread(&rstl,2,1,fp);
- fseek(fp,rsrc+rsm+rstl,SEEK_SET);
- fread(&rstypes,2,1,fp);
-
- while (rstypes >= 0) {
- fread(&typbuf,sizeof(typbuf),1,fp);
- if (typbuf.rtype == POST_TYPE)
- break;
- --rstypes;
- }
-
- if (rstypes < 0) {
- fclose(fp);
- fprintf(stderr,"No POST resources.\n");
- continue;
- }
-
- /* Read list of POST resources and sort by resource ID */
- fseek(fp,rsrc+rsm+rstl+typbuf.offset,SEEK_SET);
- rfptr = (ref_list *)malloc(sizeof(ref_list) * (typbuf.nrsc+1));
- fread(rfptr,sizeof(ref_list),typbuf.nrsc+1,fp);
- qsort(rfptr,typbuf.nrsc+1,sizeof(ref_list),cmpid);
-
- /* Process POST resources */
- of=NULL;
- onm[0] = '\0';
- rfent = rfptr;
- len=0;
- while (typbuf.nrsc-- >= 0) {
- fseek(fp,rsrc+rsd+(rfent->offset & 0xffffff),SEEK_SET);
- fread(&rslen,4,1,fp);
- pdata = (unsigned char *)malloc(rslen);
- fread(pdata,rslen,1,fp);
- switch (pdata[0]) {
- case POST_TEXT:
- if (!of) {
- cp=pdata+2;
- while (cp < pdata+rslen) {
- if (*cp == '/') {
- if (!strncmp((char *)cp,"/FontName",9)) {
- cp += 9;
- if (isspace(*cp)) {
- while (*cp++ != '/');
- cp2=(unsigned char *)onm;
- while (!isspace((char)*cp))
- *cp2++ = *cp++;
- *cp2 = '\0';
- break;
- }
- }
- }
- cp++;
- }
- if (!onm[0])
- sprintf(onm,"%s.psf",*argv);
- of=fopen(onm,"w");
- if (!of) {
- perror(onm);
- free(pdata);
- fprintf(stderr,"%s: ",*argv);
- continue;
- }
- }
- cp=pdata+2;
- while (cp < pdata+rslen) {
- if (*cp == '\r')
- *cp='\n';
- cp++;
- }
- if (len) {
- fprintf(of,"\n");
- len=0;
- }
- fwrite(pdata+2,rslen-2,1,of);
- break;
- case POST_DATA:
- if (!of) {
- fprintf(stderr, "Data before text.\n");
- free(pdata);
- fprintf(stderr,"%s: ",*argv);
- continue;
- }
- cp=pdata+2;
- while (cp < pdata+rslen) {
- fprintf(of,"%02x",*cp++);
- if (++len > 31) {
- fprintf(of,"\n");
- len = 0;
- }
- }
- break;
- case POST_END:
- break;
- default:
- fprintf(stderr, "Unknown POST resource type %d.\n",
- pdata[0]);
- } /* end switch */
- free(pdata);
- ++rfent;
- } /* while more POST resources */
- if (len)
- fprintf(of,"\n");
- fclose(of);
- fclose(fp);
- free(rfptr);
-
- /* check for afm file */
- if (!onm[0]) {
- fprintf(stderr,"no font data.\n");
- continue;
- }
- fprintf(stderr,"converted to %s.\n",onm);
- strcpy(anm,*argv);
- strcat(anm,".afm");
- fp=fopen(anm,"r");
- if (!fp)
- continue;
-
- if (fread(&infobuf,sizeof(info_header),1,fp) < 1) {
- fclose(fp);
- continue;
- }
-
- if (infobuf.version || infobuf.nlen) {
- rslen = (infobuf.dlen[0]<<24) + (infobuf.dlen[1]<<16)
- + (infobuf.dlen[2]<<8) + infobuf.dlen[3];
- if (rslen < 1) {
- fclose(fp);
- continue;
- }
- }
- else rslen=0;
-
- strcat(onm,".afm");
- of=fopen(onm,"w");
- if (!of) {
- fclose(fp);
- continue;
- }
- do {
- c=getc(fp);
- if (c=='\r')
- putc('\n',of);
- else
- putc(c,of);
- } while (--rslen);
- fclose(of);
- fclose(fp);
- } /* while more files */
-
- return 0;
- } /* end main */
-